from PIL import Image
import os

class ImageToPDFConverter:
    """
    将图片批量转换为 PDF 文件的工具类
    """

    def __init__(self, input_dir: str = "", output_dir: str = r"C:\Users\33720\Desktop", output_name: str = "outputpdf.pdf"):
        """
        初始化转换器

        Args:
            input_dir (str): 图片所在文件夹路径
            output_dir (str): 输出PDF的文件夹路径
            output_name (str): 输出PDF文件名
        """
        self.input_dir = input_dir
        self.output_dir = output_dir
        self.output_name = output_name
        self.width_cm=8.1
        self.height_cm=14.17


    # ===== Setter 方法 =====
    def set_input_dir(self, path: str):
        """设置输入文件夹"""
        if not os.path.isdir(path):
            raise ValueError(f"❌ 输入路径不存在：{path}")
        self.input_dir = path

    def set_output_dir(self, path: str):
        """设置输出文件夹"""
        os.makedirs(path, exist_ok=True)
        self.output_dir = path

    def set_width_cm(self, width_cm: float):
            """设置输出文件夹"""
            self.width_cm = width_cm

    def set_height_cm(self, height_cm: float):
            """设置输出文件夹"""
            self.height_cm = height_cm


    def set_output_name(self, name: str):
        """设置输出PDF文件名"""
        if not name.lower().endswith(".pdf"):
            name += ".pdf"
        self.output_name = name

    # ===== 核心方法 =====
    def convert_to_pdf(self):
        """将输入文件夹下的所有图片合成为一个PDF文件"""
        if not self.input_dir or not os.path.isdir(self.input_dir):
            raise ValueError("❌ 请先设置有效的输入文件夹。")

        if not self.output_dir:
            raise ValueError("❌ 请先设置输出文件夹。")

        # 获取文件夹下的图片列表（按文件名排序）
        img_files = sorted([
            os.path.join(self.input_dir, f)
            for f in os.listdir(self.input_dir)
            if f.lower().endswith((".png", ".jpg", ".jpeg", ".webp", ".bmp"))
        ])

        if not img_files:
            raise ValueError("⚠️ 输入文件夹中未找到任何图片。")

        # 打开所有图片
        images = [Image.open(f).convert("RGB") for f in img_files]

        # 输出路径
        output_path = os.path.join(self.output_dir, self.output_name)

        # 保存为 PDF
        images[0].save(output_path, save_all=True, append_images=images[1:])
        print(f"✅ PDF 已生成：{output_path}")

        return output_path

        # ===== 带页面尺寸和缩放的转换 =====
    def convert_to_pdf_with_size(self):
        width_cm=self.width_cm
        height_cm=self.height_cm
        """
        将图片按比例缩放以适应PDF页面大小并导出
        Args:
            width_cm (float): 页面宽度（cm）
            height_cm (float): 页面高度（cm）
        """
        if not self.input_dir or not os.path.isdir(self.input_dir):
            raise ValueError("❌ 请先设置有效的输入文件夹。")
        if not self.output_dir:
            raise ValueError("❌ 请先设置输出文件夹。")

        img_files = sorted([
            os.path.join(self.input_dir, f)
            for f in os.listdir(self.input_dir)
            if f.lower().endswith((".png", ".jpg", ".jpeg", ".bmp", ".webp"))
        ])
        if not img_files:
            raise ValueError("⚠️ 输入文件夹中未找到任何图片。")

        # cm 转换为像素（1 inch = 2.54 cm, 1 inch = 300 px at 300dpi）
        dpi = 300
        width_px = int(width_cm / 2.54 * dpi)
        height_px = int(height_cm / 2.54 * dpi)

        resized_images = []
        for f in img_files:
            img = Image.open(f).convert("RGB")
            img_w, img_h = img.size

            # 按比例缩放（保持长宽比）
            ratio = min(width_px / img_w, height_px / img_h)
            new_size = (int(img_w * ratio), int(img_h * ratio))
            img = img.resize(new_size, Image.Resampling.LANCZOS)

            # 创建白底（保证页面尺寸一致）
            page = Image.new("RGB", (width_px, height_px), (255, 255, 255))

            # 居中粘贴
            x = (width_px - new_size[0]) // 2
            y = (height_px - new_size[1]) // 2
            page.paste(img, (x, y))

            resized_images.append(page)

        # 输出路径
        output_path = os.path.join(self.output_dir, self.output_name)

        # 保存为PDF
        resized_images[0].save(output_path, save_all=True, append_images=resized_images[1:], dpi=(dpi, dpi))
        print(f"✅ PDF 已生成：{output_path} （页面大小：{width_cm}×{height_cm} cm）")

        return output_path
#
# img =ImageToPDFConverter()
# img.set_input_dir(r"C:\Users\33720\Desktop\temp\imgpng2\词汇2")
# # img.convert_to_pdf()
# img.set_output_name("词汇2.pdf")
# img.convert_to_pdf_with_size()
